/*
* Copyright © 2018 Union Mobile Financial Technology Co.Ltd
* All Rights Reserved
* @Description: TODO(功能描述)
* @author lile 
* @date 2018年1月29日 下午3:17:41
*
*/ 
package com.umpay.utils;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.regex.Pattern;

import com.umpay.config.Regex;
import com.umpay.dict.retcode.MemberMgrEC;
import com.umpay.exception.BusinessException;

/**
***********************************************************
* @ClassName: CheckAuthBusiDataUtil
* @Description: TODO(功能描述)
* @author lile
* @date 2018年1月29日 下午3:17:41
* @version 1.0 
*
* Modification History:
* Date         Author          Version            Description
*---------------------------------------------------------*
* 2018年1月29日     lile           v1.0.0               修改原因
************************************************************
*/
public class RegexUtil {
	
	
	/**
	 * 校验18位身份证号
	 * 
	 * @param identityCode
	 * 
	 * 返回true则表示校验通过
	 */
	public static boolean checkIdentityCode(String identityCode) {
		// 校验身份证位数为18位
		if (!identityCode.matches("\\d{17}(\\d|x|X)$")) {
			return false;
		}
		Date d = new Date();
		DateFormat df = new SimpleDateFormat("yyyyMMdd");
		int year = Integer.parseInt(df.format(d));
		if (Integer.parseInt(identityCode.substring(6, 10)) < 1900
				|| Integer.parseInt(identityCode.substring(6, 10)) > year) {// 7-10位是出生年份，范围应该在1900-当前年份之间
			return false;
		}
		if (Integer.parseInt(identityCode.substring(10, 12)) < 1
				|| Integer.parseInt(identityCode.substring(10, 12)) > 12) {// 11-12位代表出生月份，范围应该在01-12之间
			return false;
		}
		if (Integer.parseInt(identityCode.substring(12, 14)) < 1
				|| Integer.parseInt(identityCode.substring(12, 14)) > 31) {// 13-14位是出生日期，范围应该在01-31之间
			return false;
		}
		// 校验第18位
		// S = Sum(Ai * Wi), i = 0, ... , 16 ，先对前17位数字的权求和
		// Ai:表示第i位置上的身份证号码数字值
		// Wi:表示第i位置上的加权因子
		// Wi: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
		String[] tempA = identityCode.split("|");
		int[] a = new int[18];
		for (int i = 0; i < tempA.length - 2; i++) {
			a[i] = Integer.parseInt(tempA[i + 1]);
		}
		int[] w = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 }; // 加权因子
		int sum = 0;
		for (int i = 0; i < 17; i++) {
			sum = sum + a[i] * w[i];
		}
		// Y = mod(S, 11)
		// 通过模得到对应的校验码
		// Y: 0 1 2 3 4 5 6 7 8 9 10
		// 校验码: 1 0 X 9 8 7 6 5 4 3 2
		String[] v = { "1", "0", "x", "9", "8", "7", "6", "5", "4", "3", "2" }; // 校验码
		int y = sum % 11;
		if (!v[y].equalsIgnoreCase(identityCode.substring(17))) {// 第18位校验码错误
			return false;
		}
		return true;
	}
	
	public static boolean checNotkNullRequestParam(Object parm) {
		return StringUtils.isNotEmpty(StringUtils.trim(parm));
	}
	
	
	public static boolean checkRegexKeyRequestParam(String regexKey, Object value) {
		String regx = Regex.getRegexRuleByKey(regexKey);
		if (regx == null || "".equals(regx.trim())) {
            return true;
        }
		Pattern pattern = Pattern.compile(regx);
		return pattern.matcher(StringUtils.trim(value)).matches();
	} 
	
	public static boolean checkRegexAndNotNull(String regexKey, Object parm) {
		return checNotkNullRequestParam(parm) && checkRegexKeyRequestParam(regexKey, parm);
		
	}
	public static void main(String[] args) {
		//checNotkNullRequestParam("merId", "100");
	}
}
